#ifndef PLY_INIT_H
#define PLY_INIT_H

typedef struct _PlyBarycenterCoords {

	float xm, ym, zm; /* Coordenadas do baricentro */

} PlyBarycenterCoords;

typedef struct _PlyExtremityVertices {

	int x_ext_min, x_ext_max; /* Indices no vetor de vertices para os pontos extremos no eixo x */
	int y_ext_min, y_ext_max; /* Indices no vetor de vertices para os pontos extremos no eixo y */
	int z_ext_min, z_ext_max; /* Indices no vetor de vertices para os pontos extremos no eixo z */

} PlyExtremityVertices;

typedef struct _PlyBoundingSphere {

	float x, y, z; /* Coordenadas do centro da esfera */
	float radius; /* Raio da esfera */

} PlyBoundingSphere;

typedef struct _PlyTranslationOffset {

	float x_tr, y_tr, z_tr; /* Armazena deslocamentos efetuados nos tres eixos para dado objeto na cena */

} PlyTranslationOffset;

typedef struct _PlyRotationOffset {

	float angle; /* Armazena a magnitude da rotacao efetuada para dado objeto na cena */
	float x_axis, y_axis, z_axis; /* Armazena o vetor em relacao ao qual o objeto na cena efetua a rotacao */

} PlyRotationOffset;

typedef struct _PlyModel {

	char* file_name; /* Nome do arquivo que contem o model */
	char* scene_name; /* Nome do modelo na cena (configurado atraves da funcao 'PlyModel * initPly(char* scene_name, char* file_name)' ) */

	unsigned int id; /* Armazena um identificador unico para o objeto */

	float aspect; /* Armazena a razao LARGURA / ALTURA do objeto */
	float ideal_eyeZ; /* Armazena o valor ideal para a coordenada Z da camera para um campo de visao vertical de 90 graus */

	Vertex** vlist; /* Vetor de vertices */
	Face** flist; /* Vetor de faces */

	int num_faces; /* Numero total de faces */ 
	int num_vertices; /* Numero total de vertices */

	PlyBarycenterCoords* bc_coords;
	PlyExtremityVertices* ext_vertices;
	PlyBoundingSphere* b_sphere;
	PlyTranslationOffset* tr_offset;
	PlyRotationOffset* rt_offset;

} PlyModel;

/* Retorna um ponteiro para uma estrutura que contem indices (no vetor de vertices do modelo carregado) sobre pontos extremos do objeto */
extern PlyExtremityVertices *
getPlyExtremityVertices(int num_vertices, Vertex** vlist);

/* Retorna um ponteiro para uma estrutura que contem as coordenadas x, y e z do baricentro do objeto */
extern PlyBarycenterCoords *
getPlyBarycenterCoords(int num_vertices, Vertex** vlist);

/* Retorna um ponteiro para uma estrutura que contem o raio e as coordenadas do centro da esfera que circunscreve o objeto */
extern PlyBoundingSphere *
getPlyBoundingSphere(int num_vertices, Vertex** vlist, PlyBarycenterCoords* bcoords);

/* Retorna um ponteiro para uma estrutura que a ultima translacao do objeto nos tres eixos */
extern PlyTranslationOffset *
getPlyTranslationOffset();

/* Retorna um ponteiro para uma estrutura que contem o angulo de giro e as componentes do vetor sobre o qual foi efetuada a rotacao */
extern PlyRotationOffset *
getPlyRotationOffset();

/* Configura um identificador interno unico para cada modelo carregado */
extern void
setPlyModelID(PlyModel* ply_model);

/* Configura a razao LARGURA / ALTURA para cada modelo carregado */
extern void
setPlyModelAspect(PlyModel* ply_model);

/* Configura o valor ideal para a coordenada Z da camera para um campo de visao vertical de 90 graus */
extern void
setPlyModelIdealEyeZ(PlyModel* ply_model);

/* Retorna um ponteiro para uma estrutura que simboliza um modelo PLY */
extern PlyModel *
initPly(char* scene_name, char* file_name);

/* Mostra informacoes sobre modelo passado */
extern void
showPlyInfo(PlyModel* ply_model);

#endif
